/**
 *  此头文件定义了一些通用常量和实用函数的声明，用于客户端程序。
 * 
 * 该头文件通过预处理器指令防止头文件被重复包含，定义了缓冲区大小、用户名长度等常量，
 * 并声明了一系列实用函数，可用于字符串处理、时间戳获取、目录创建等操作。
 */

#ifndef UTILS_H
#define UTILS_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <time.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <stdbool.h>

// 通用常量定义
// 定义缓冲区大小为 1024 字节，可用于存储从网络或文件读取的数据
#define BUFFER_SIZE 1024
// 定义用户名的最大长度为 50 个字符
#define USERNAME_LEN 50
// 定义密码的最大长度为 50 个字符
#define PASSWORD_LEN 50
// 定义服务器最多可连接的客户端数量为 6 个
#define MAX_CLIENTS 6

// 实用函数声明

/**
 *  去除字符串末尾的换行符。
 * 
 * 该函数会检查字符串末尾是否存在换行符（'\n' 或 '\r'），
 * 若存在则将其替换为字符串结束符 '\0'，并返回处理后的字符串长度。
 * 
 *  str 要处理的字符串。
 * return 处理后字符串的长度。
 */
size_t trim_newline(char *str);

/**
 *  去除字符串首尾的空白字符。
 * 
 * 该函数会从字符串首尾开始查找非空白字符，
 * 并将指针指向第一个非空白字符，
 * 然后从末尾开始查找非空白字符，
 * 并将指针指向最后一个非空白字符，
 * 最后将两个指针之间的内容复制到原字符串的开头，
 * 并在末尾添加字符串结束符 '\0'。
 * 
 *  str 要处理的字符串。
 */
void trim_string(char *str);

/**
 *  安全地复制字符串，防止缓冲区溢出。
 * 
 * 该函数会将源字符串复制到目标缓冲区，最多复制 dest_size - 1 个字符，
 * 确保目标缓冲区不会溢出，并在复制完成后添加字符串结束符 '\0'。
 * 
 *  dest 目标缓冲区，用于存储复制后的字符串。
 *  src 源字符串，要复制的字符串。
 *  dest_size 目标缓冲区的大小。
 * return 若复制成功返回 0，若源字符串长度超过目标缓冲区大小返回 -1。
 */
int safe_strcpy(char *dest, const char *src, size_t dest_size);

/**
 *  检查字符串是否为空或只包含空白字符。
 * 
 * 该函数会遍历字符串中的每个字符，检查是否全部为空白字符（如空格、制表符、换行符等），
 * 若字符串为空或只包含空白字符返回 1，否则返回 0。
 * 
 *  str 要检查的字符串。
 * return 若字符串为空或只包含空白字符返回 1，否则返回 0。
 */
int is_empty_or_whitespace(const char *str);

/**
 *  检查用户名是否合法。
 * 
 * 该函数会根据特定规则检查用户名是否合法，
 * 例如用户名长度是否在允许范围内，是否包含非法字符等。
 * 
 *  name 要检查的用户名。
 * return 若用户名合法返回 1，否则返回 0。
 */
bool is_valid_username(const char *name);

/**
 *  获取当前时间戳并格式化为字符串。
 * 
 * 该函数会获取当前系统时间，并将其格式化为指定的字符串格式，
 * 存储到提供的缓冲区中，确保不会超出缓冲区大小。
 * 
 *  buffer 用于存储时间戳字符串的缓冲区。
 *  size 缓冲区的大小。
 */
void get_timestamp(char *buffer, size_t size);

/**
 *  如果指定目录不存在，则创建该目录。
 * 
 * 该函数会检查指定路径的目录是否存在，若不存在则尝试创建该目录。
 * 
 *  path 要检查和创建的目录路径。
 * return 若目录已存在或创建成功返回 0，若创建失败返回 -1。
 */
int create_directory_if_not_exists(const char *path);



// 结束头文件保护代码块
#endif
